const path = require('path')
const fs = require('fs')
const axios = require('axios')

/**
 * 调用其他云函数
 * @param name 函数名称
 * @param args 调用参数
 */
export async function callFunction(name: string, ...args){

}

/**
 * 定义一个云函数
 * @param name 名称
 * @param body 可调用函数体
 * @param returns 返回值类型
 * @param params 必需形参列表
 * @param kwparams 关键字可选解构参数
 * @param requires 需要的npm模块
 * @param lifecycle 生命周期：forever/runtime/session/temp
 */
export async function defineFunction(body:Function, name?:string, requires?:string[], lifecycle="forever",
                                     returns?:Function[], params?:FunctionConstructor[], kwparams?:{}, ){
    const fnName = body.name || name || `fn_${Math.round(Math.random()*100000)}`

}

/**
 * 删除云函数
 * @param name
 */
export async function deleteFunction(name: string){

}

/**
 * 批量删除云函数
 * @param name
 */
export async function clearFunctions(name?: RegExp | string){

}

/**
 * 测试指定的云函数
 * @param name 名称
 * @param time 测试次数
 * @param args 参数
 */
export async function testFunction(name: string, time: number=10000, ...args){

}

/**
 * 运行指定的临时云脚本
 * @param script 脚本字符串
 * @param fns 需要用到的云函数列表
 * @param thisContext this指向内容
 * @param lang 脚本语言类型：es5/es6/es7/es8/ts
 */
export async function evalScript(script:string, fns?:string[], thisContext:any=global, lang:string='es7'){

}

/**
 * 上传本地js函数字符串为云函数
 * @param file 源码文件
 * @param name 函数名称
 */
export async function uploadFunction(file:string, name?:string){
    const fnName = name || path.parse(file).name `fn_${Math.round(Math.random()*100000)}`
    const src = fs.readFileSync(file, {encoding: 'utf8'}).toString()
    await axios.post('http://127.0.0.1/functions/', {
        name: fnName, src,
    })
    return true
}

/**
 * 下载云函数，并转换为本地node函数
 * @param names 云函数列表
 */
export async function downloadFunctions(...names:string[]):Promise<CallableFunction[]>{
    return []
}

/**
 * 管道函数，将多个云函数串联起来串行执行，并将上一个函数的返回值结果作为下一个云函数的参数传入，并返回最后一个云函数的返回值
 * @param fns
 * @param args
 */
export async function pipeFunctions(fns:string[], ...args){

}

/**
 * 获取云函数对象，并可从中获取云函数的相关meta信息
 * @param names
 */
export async function getFunctions(...names:string[]):Promise<[]>{
    return []
}

/**
 * 为云函数设置属性
 * @param name 云函数名称
 * @param prop 属性名称
 * @param val 属性值
 */
export async function setProp(name:string, prop:string, val:any){

}

/**
 * 获取函数的调用历史记录
 * @param name 函数名称
 * @param levels 调用级别：success(调用成功), error(调用函数内部抛出异常), timeout(调用超时)，fail(调用发生系统错误)
 */
export async function getCallsList(name: string, levels=[]){

}

/**
 * 获取云函数的打印日志输出信息
 * @param name 函数名称
 * @param levels 日志级别：info/warn/error/debug
 */
export async function getLogs(name?: string, levels:string[]=[]){

}

/**
 * 调试指定的云函数
 * @param name
 * @param lines 调试的断点所在的行数
 * @param mode 调试的模式：debugger/sleep/return/break
 * @param args
 */
export async function debugFunction(name: string, lines:number[], mode:string="debugger", ...args){

}

/**
 * 恢复云函数的执行
 * @param name
 * @param ignoresBreaks 是否忽略后面的所有断点
 */
export async function resumeFunction(name: string, ignoreBreaks:boolean=false){

}
